#include<stdio.h>
#include<stdlib.h>

struct nodoLista{
       char dato;
       struct nodoLista *sgteptr;
};

typedef struct nodoLista NODOLISTA;
typedef NODOLISTA *NODOPTR;

void ingresar(NODOPTR *p,char valor);
char eliminar(NODOPTR *p, char valor);
int listaVacia(NODOPTR  p);
void imprimir(NODOPTR dptr);
void menu(void);

int main(void){
  
  NODOPTR startptr=NULL;
  int opcion;
  char item;
  
  menu();
  printf("?\n");
  scanf("%i",&opcion);
  
  while(opcion != 3){
    
    switch(opcion){
      
      case 1:
	
	printf("Ingrese un caracter: ");
	scanf("%c",&item);
	ingresar(&startptr, item);
        imprimir(startptr);
	break;
	
      case 2:
	
	if(!listaVacia(startptr)){
	printf("Ingrese un caracter para eliminar: ");
	scanf("%c",&item);
	    if( eliminar(&startptr, item)){
	      printf("%c eliminado.\n",item);
	      
	    }
	     else 
	       printf("%c no se encontro el caracter.\n\n",item);
	}
	else
	  printf("la lista esta Vacia.");
	break;
	
	
      default:
	printf("Opcion invalida.\n\n");
	menu();
	break;

	}
    
    printf("?");
    scanf("%d",&opcion);
    
    }
   printf("Fin de programa.\n");
   
   return 0;
  
 }
 
 void menu(void){
   
   printf("Ingrese la opcion que quiera porfavor: \n");
   printf("1 para insertar un elemento. \n");
   printf("2 para eliminar un elemento. \n");
   printf("3 para finalizar.\n");
   
 }
 
 
 void ingresar(NODOPTR *p,char valor){
    NODOPTR newptr,previoptr,dptr;
    
    newptr= malloc(sizeof(NODOLISTA));
    
    if(newptr!=NULL){
      newptr->dato = valor;
      newptr-> sgteptr = NULL;    
      
    previoptr = NULL;
    dptr = *p;
    
    while(dptr != NULL && valor > dptr-> dato){
      
      previoptr = dptr;
      dptr = dptr -> sgteptr;
      
         }
	 if(previoptr == NULL){
	   newptr -> sgteptr = *p;
	   *p = newptr;
	 
	 }
	 else{
	 previoptr->sgteptr = newptr;
	 newptr -> sgteptr = dptr;
	 
	     }
        }
	else 
	  printf("%c no se inserto no hay memoria.\n",valor);
	
 }
   char eliminar(NODOPTR *p, char valor){
     
     NODOPTR  previoptr;
     NODOPTR  dptr;
     NODOPTR  tptr;
     
     if(valor == (*p)->dato){
	tptr = *p;
	*p =(*p)->sgteptr ;
	free(tptr);
	return valor;
     
     } else{
       previoptr = *p;
       dptr =(*p) -> sgteptr;
       
	  while(dptr != NULL && dptr ->dato != valor){
		previoptr = dptr;
		dptr = dptr -> sgteptr;
	  
	  }
	  if(dptr != NULL){
	      tptr = dptr;
	      previoptr -> sgteptr = dptr -> sgteptr;
	      free(tptr);
	      return valor;
	  
	  }
   }
      return '\n';
      
}

  int listaVacia(NODOPTR  p){
    return p == NULL;
      
}

    void imprimir(NODOPTR dptr){
    
	if(dptr == NULL)
	    printf("La lista esta vacia.\n\n");
	
	else{
	    printf("La lista es :\n");
	    
	    while(dptr != NULL){
		printf("%c -->", dptr-> dato);
		dptr = dptr-> sgteptr;
	    
	    }
	    printf("NULL\n\n");
	
	}
 }
      
      
      
      
      
      
      